<?php
/**
 * @abstract    Chamado
 * Abstracao dos tipos de chamado do sistema
 */
abstract class Chamado {

    public $tMysqli;
    protected $IDChamado;
    protected $IDCliente;
    protected $IDResponsavel;
    protected $IDSetor;
    protected $StTitulo;

    protected $DtCriacao;
    protected $DtFechamento;
    protected $EnTipoChamado;
    protected $EnStatus;
    protected $EnPrioridade;

    protected $ArMensagens = array();
    /**
     * @var Setor
     */
    private $Setor;
    /**
     * @var Cliente
     */
    private $Cliente;
    /**
     * @var Usuario
     */
    private $Funcionario;
    /**
     * @var Avakuacai
     */
    private $Avaliacao;


    const PHONE_CALLED = 'TELEFONICO';
    const EXTERNAL_CALLED = 'EXTERNO';
    const INTERNAL_CALLED = 'INTERNO';
    const CANCELLED_CALLED = "CANCELAMENTO";

    public abstract function loadDataCreatedCall();
    public abstract function loadDataCalled($ArDados);

    /**
     * @method  calledFactory
     *
     * Fabrica de criacao de chamado
     *
     * @param Array $ArDados    Array com os dados do chamado que serao inicializados
     * @param MyDb  $tMysqli    Objeto de Conexao com o Banco de dados
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Abril de 2012
     * @return  ChamadoTelefonico|ChamadoInterno|ChamadoExterno
     */
    public static function calledFactory($ArDados, &$tMysqli) {
        if($ArDados['EnTipoChamado'] == self::PHONE_CALLED) {
            $Chamado = new ChamadoTelefonico($ArDados, $tMysqli);
            $Chamado->loadDataCalled($ArDados);
            return $Chamado;
        } else if($ArDados['EnTipoChamado'] == self::EXTERNAL_CALLED) {
            $Chamado = new ChamadoExterno($ArDados, $tMysqli);
            $Chamado->loadDataCalled($ArDados);
            return $Chamado;
        } else if($ArDados['EnTipoChamado'] == self::INTERNAL_CALLED) {
            $Chamado = new ChamadoInterno($ArDados, $tMysqli);
            $Chamado->loadDataCalled($ArDados);
            return $Chamado;
        } else if($ArDados['EnTipoChamado'] == self::CANCELLED_CALLED) {
            $Chamado = new ChamadoCancelamento($ArDados, $tMysqli);
            $Chamado->loadDataCalled($ArDados);
            return $Chamado;
        }
        return false;
    }

    public function fill() {
        $mensagemService = MensagemService::getInstance();
        $this->ArMensagens = $mensagemService->findByCalled($this);
    }

    /**
     * @method  getFirstMessage
     *
     * Pega a primeira mensagem (Enunciado ou Solicitacao Inicial) do chamado
     *
     * @return  Message
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Abril de 2011
     */
    public function getFirstMessage() {
        return $this->ArMensagens[0];
    }
    /**
     * @method  getLastAnswer
     *
     * Pega a ultima resposta do chamado
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @return  Mensagem
     * @since   Agosto de 2012
     */
    private function getLastAnswer() {
        for( $i = count($this->ArMensagens)-1; $i > 0; $i-- ) {
            if( $this->ArMensagens[$i]->isAnswer() ) {
                return $this->ArMensagens[$i];
            }
        }
        return $this->getFirstMessage();
    }

    /**
     * @method  isPriority
     *
     * Com base no atributo EnPrioridade, esse metodo informa se este chamado
     * foi marcado como prioritario ou nao
     *
     * @return  Boolean
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Abril de 2011
     */
    public function isPriority() {
        return $this->EnPrioridade == 'TRUE' ? true : false;
    }
    /**
     * @method  is2DaysWithoutAnswer
     *
     * Informa se o Chamado está a mais de 2 dias sem resposta do atendente.
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @return  Boolean
     * @since   Agosto de 2012
     */
    public function is2DaysWithoutAnswer() {
        $ArDiff = dateDiff( $this->getLastAnswer()->getDtResposta(), now() );
        return $ArDiff['day'] > 2;
    }

    public function getStatusDescription() {
        $ArDescriptions = array('TELEFONICO' => 'Chamado Telef&ocirc;nico', 'ATENDENTE' => 'Aguardando Atendimento', 'CLIENTE' => 'Aguardando Cliente', 'FECHADO' => 'Chamado Fechado');
        return $ArDescriptions[$this->EnStatus];
    }

    public function wasEvaluated() {
        return !empty($this->Avaliacao);
    }

    public function hasResponsible() {
        return !empty($this->IDResponsavel);
    }

    public function isClosed() {
        return $this->EnStatus == 'FECHADO';
    }

    public function isPhoneCalled() {
        return $this->EnTipoChamado == 'TELEFONICO';
    }

    public function isInternalCalled() {
        return $this->EnTipoChamado == 'INTERNO';
    }

    public function isExternalCalled() {
        return $this->EnTipoChamado == 'EXTERNO';
    }

    public function isFromLoggedUserSector() {
        return $this->IDSetor == Dracosys::getLoggedUser()->getTDepartamento()->getSetores(true)->getIDSetor();
    }

    public function getShowedData() {
        return array(
            'preview' => DRA_URL . 'atendimento/visualizar-chamado/id/' .$this->IDChamado,
            'title' => $this->StTitulo
        );
    }

    public function countBlockedMessages() {
        $ItNumberOfBlockedMessages = 0;
        foreach( $this->ArMensagens as $Mensagem ) {
            if( $Mensagem->isWaitingLiberation() ) {
                $ItNumberOfBlockedMessages++;
            }
        }
        return $ItNumberOfBlockedMessages;
    }

    //##Getters and Setters
    public function getIDChamado() {
        return $this->IDChamado;
    }

    public function setIDChamado($IDChamado) {
        $this->IDChamado = $IDChamado;
    }

    public function getIDCliente() {
        return $this->IDCliente;
    }

    public function setIDCliente($IDCliente) {
        $this->IDCliente = $IDCliente;
    }

    public function getIDResponsavel() {
        return $this->IDResponsavel;
    }

    public function setIDResponsavel($IDResponsavel) {
        $this->IDResponsavel = $IDResponsavel;
    }

    public function getIDSetor() {
        return $this->IDSetor;
    }

    public function setIDSetor($IDSetor) {
        $this->IDSetor = $IDSetor;
    }

    public function getStTitulo() {
        return $this->StTitulo;
    }

    public function setStTitulo($StTitulo) {
        $this->StTitulo = $StTitulo;
    }

    public function getDtCriacao() {
        return $this->DtCriacao;
    }

    public function setDtCriacao($DtCriacao) {
        $this->DtCriacao = $DtCriacao;
    }

    public function getDtFechamento() {
        return $this->DtFechamento;
    }

    public function setDtFechamento($DtFechamento) {
        $this->DtFechamento = $DtFechamento;
    }

    public function getEnTipoChamado() {
        return $this->EnTipoChamado;
    }

    public function setEnTipoChamado($EnTipoChamado) {
        $this->EnTipoChamado = $EnTipoChamado;
    }

    public function getEnStatus() {
        return $this->EnStatus;
    }

    public function setEnStatus($EnStatus) {
        $this->EnStatus = $EnStatus;
    }

    public function getEnPrioridade() {
        return $this->EnPrioridade;
    }

    public function setEnPrioridade($EnPrioridade) {
        $this->EnPrioridade = $EnPrioridade;
    }

    public function getArMensagens() {
        return $this->ArMensagens;
    }

    public function setArMensagens($ArMensagens) {
        $this->ArMensagens = $ArMensagens;
    }

    public function getSetor() {
        return $this->Setor;
    }

    public function setSetor($Setor) {
        $this->Setor = $Setor;
    }

    public function getCliente() {
        return $this->Cliente;
    }

    public function setCliente($Cliente) {
        $this->Cliente = $Cliente;
    }

    public function getFuncionario() {
        return $this->Funcionario;
    }

    public function setFuncionario($Funcionario) {
        $this->Funcionario = $Funcionario;
    }

    public function getAvaliacao() {
        return $this->Avaliacao;
    }

    public function setAvaliacao($Avaliacao) {
        $this->Avaliacao = $Avaliacao;
    }

}

?>
